package com.cskaoyan.javase.oop1._4this;

/**
 * @description: this关键字
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import jdk.nashorn.internal.codegen.CompilerConstants;

/**
 * > 按照下述说明写代码，研究问题
 * - 创建一个汽车类，有颜色和速度两个属性，行为是可以跑
 *   - 然后在成员方法中访问该属性，创建对象后调用该方法并查看结果
 *   - 然后在成员方法的形参列表中，定义和属性同名的局部变量，不修改方法体再次调用该方法
 * 思考：
 * - 两次调用的结果是否一致，如果不同原因是什么?
 * 就近原则: 成员方法中color可以同时访问同名的成员变量和局部变量,这时遵循就近原则,优先选择局部变量的数据
 *
 * - 如果我想在有同名参的方法中，访问同名成员变量，怎么办？
 * 这里就需要使用this关键字
 *
 * 何为this关键字: 在一个类的成员方法中,它的形参列表中具有隐式传入的参数,该参数时一个引用指向了当前对象,该引用使用this关键字表示
 *
 * 何为当前对象: 哪个对象来调用该成员方法,this当前对象就是指那个对象
 *
 * 以上,因为this是当前对象的引用,所以可以使用对象名点(也就是this.)去访问当前对象的成员变量和成员方法
 *
 * 当我们知道了成员方法的形参列表中隐含了this指向当前对象后,就可以解释以下问题:
 * 1,为什么成员方法能够访问成员,为什么成员方法之间能够互相访问
 *      因为已经隐含了this,所以能够访问,并且在不需要区分的时候this是可以省略的
 * 2,为什么加了static的方法不能直接访问成员变量和成员方法?
 *      因为没有隐含的this
 *
 * this关键字的作用
 * 1. 可以在成员方法中区分同名的成员变量和局部变量
 * 2. 可以在成员方法中去调用别的成员方法（实际上并没有必要写出这个this）
 *    - static方法和static方法之间可以直接互相调用
 *    - 非static成员方法之间也可以直接互相调用
 *    - static方法中想要访问成员方法，必须先创建对象
 * 3. this很重要的用途是：
 *    - 用来指示一个变量到底是成员变量还是局部变量
 *    - **在代码比较复杂的情况下，可以显著增加代码可读性**
 * 以上用途只是this使用的冰山一角,this还有很重要的其他功能,后面学习
 *
 * > 总结和注意事项
 * - this指向当前对象的隐式传参，必须是在普通成员方法中
 *   - 加static的方法中，没有该this传参
 * - 可以在成员方法中打印该this关键字，可以发现和在main方法中打印对象名（引用）结果一致
 * - 既然this指向当前对象，那么不同的this指向的对象必然不同
 *
 */
public class Demo {
    public static void main(String[] args) {
        Car c = new Car();
        /*System.out.println(c.color); //白
        c.run(); //白色的车跑*/
        c.run('黑');
        Car c2 = new Car();
        c2.color = '绿';
        c2.run('黑');
    }
}

class Car {
    char color = '白';
    double speed;

    public void run(char color) {
        System.out.println(speed);
        System.out.println(this);
        System.out.println(this.color + "色的小汽车嘟嘟嘟的跑！");
    }

    public void test() {
        this.run('白');
    }

    public static void testStatic() {
        //System.out.println(this);
    }

    public void method(int a, int b) {
        //...
        //...
        System.out.println(speed);
    }
}
